1 package edu.jiangxin.apktoolbox.file.checksum.panel;
2
3 import edu.jiangxin.apktoolbox.file.checksum.CalculateType;
4 import edu.jiangxin.apktoolbox.swing.extend.EasyChildTabbedPanel;
5 import edu.jiangxin.apktoolbox.swing.extend.filepanel.FilePanel;
6 import edu.jiangxin.apktoolbox.utils.Constants;
7 import org.apache.commons.codec.digest.DigestUtils;
8 import org.apache.commons.io.FileUtils;
9
10 import javax.swing.*;
11 import java.io.File;
12 import java.io.FileInputStream;
13 import java.io.FileNotFoundException;
14 import java.io.IOException;
15
16 public class FileChecksumPanel extends EasyChildTabbedPanel {
17 private static final long serialVersionUID = 63924900336217723L;
18
19 private FilePanel filePanel;
20
21 private JPanel optionPanel;
22
23 private JTextField sizeTextField;
24 private JTextField lastModifiedTimeTextField;
25 private JCheckBox md5CheckBox;
26 private JTextField md5TextField;
27 private JCheckBox sha1CheckBox;
28 private JTextField sha1TextField;
29 private JCheckBox sha256CheckBox;
30 private JTextField sha256TextField;
31 private JCheckBox sha384CheckBox;
32 private JTextField sha384TextField;
33 private JCheckBox sha512CheckBox;
34 private JTextField sha512TextField;
35 private JCheckBox crc32CheckBox;
36 private JTextField crc32TextField;
37
38 private JPanel operationPanel;
39 private JProgressBar progressBar;
40
41 @Override
42 public void createUI() {
43 BoxLayout boxLayout = new BoxLayout(this, BoxLayout.Y_AXIS);
44 setLayout(boxLayout);
45
46 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
47 createFileNamePanel();
48 add(filePanel);
49
50 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
51 createOptionPanel();
52 add(optionPanel);
53
54 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
55 createOperationPanel();
56 add(operationPanel);
57 }
58
59 private void createFileNamePanel() {
60 filePanel = new FilePanel("Choose File");
61 filePanel.initialize();
62 filePanel.setFileReadyCallback(file -> {
63 if (file == null) {
64 logger.error("file is null");
65 return;
66 }
67 calculate(file);
68 });
69 }
70
71 private void createOptionPanel() {
72 optionPanel = new JPanel();
73 BoxLayout boxLayout = new BoxLayout(optionPanel, BoxLayout.Y_AXIS);
74 optionPanel.setLayout(boxLayout);
75
76 JPanel sizeOptionPanel = new JPanel();
77 JPanel lastModifiedTimeOptionPanel = new JPanel();
78 JPanel md5OptionPanel = new JPanel();
79 JPanel sha1OptionPanel = new JPanel();
80 JPanel sha256OptionPanel = new JPanel();
81 JPanel sha384OptionPanel = new JPanel();
82 JPanel sha512OptionPanel = new JPanel();
83 JPanel crc32OptionPanel = new JPanel();
84
85 optionPanel.add(sizeOptionPanel);
86 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
87 optionPanel.add(lastModifiedTimeOptionPanel);
88 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
89 optionPanel.add(md5OptionPanel);
90 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
91 optionPanel.add(sha1OptionPanel);
92 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
93 optionPanel.add(sha256OptionPanel);
94 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
95 optionPanel.add(sha384OptionPanel);
96 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
97 optionPanel.add(sha512OptionPanel);
98 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
99 optionPanel.add(crc32OptionPanel);
100
101 sizeOptionPanel.setLayout(new BoxLayout(sizeOptionPanel, BoxLayout.X_AXIS));
102 JLabel fileSizeLabel = new JLabel("Size:");
103 sizeTextField = new JTextField();
104 sizeOptionPanel.add(fileSizeLabel);
105 sizeOptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
106 sizeOptionPanel.add(sizeTextField);
107
108 lastModifiedTimeOptionPanel.setLayout(new BoxLayout(lastModifiedTimeOptionPanel, BoxLayout.X_AXIS));
109 JLabel fileLastModifiedTimeLabel = new JLabel("Last Modified Time:");
110 lastModifiedTimeTextField = new JTextField();
111 lastModifiedTimeOptionPanel.add(fileLastModifiedTimeLabel);
112 lastModifiedTimeOptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
113 lastModifiedTimeOptionPanel.add(lastModifiedTimeTextField);
114
115 md5OptionPanel.setLayout(new BoxLayout(md5OptionPanel, BoxLayout.X_AXIS));
116 md5CheckBox = new JCheckBox("MD5 checksum:");
117 md5CheckBox.setSelected(true);
118 md5TextField = new JTextField();
119 md5OptionPanel.add(md5CheckBox);
120 md5OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
121 md5OptionPanel.add(md5TextField);
122
123 sha1OptionPanel.setLayout(new BoxLayout(sha1OptionPanel, BoxLayout.X_AXIS));
124 sha1CheckBox = new JCheckBox("SHA1 checksum:");
125 sha1TextField = new JTextField();
126 sha1OptionPanel.add(sha1CheckBox);
127 sha1OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
128 sha1OptionPanel.add(sha1TextField);
129
130 sha256OptionPanel.setLayout(new BoxLayout(sha256OptionPanel, BoxLayout.X_AXIS));
131 sha256CheckBox = new JCheckBox("SHA256 checksum:");
132 sha256TextField = new JTextField();
133 sha256OptionPanel.add(sha256CheckBox);
134 sha256OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
135 sha256OptionPanel.add(sha256TextField);
136
137 sha384OptionPanel.setLayout(new BoxLayout(sha384OptionPanel, BoxLayout.X_AXIS));
138 sha384CheckBox = new JCheckBox("SHA384 checksum:");
139 sha384TextField = new JTextField();
140 sha384OptionPanel.add(sha384CheckBox);
141 sha384OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
142 sha384OptionPanel.add(sha384TextField);
143
144 sha512OptionPanel.setLayout(new BoxLayout(sha512OptionPanel, BoxLayout.X_AXIS));
145 sha512CheckBox = new JCheckBox("SHA512 checksum:");
146 sha512TextField = new JTextField();
147 sha512OptionPanel.add(sha512CheckBox);
148 sha512OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
149 sha512OptionPanel.add(sha512TextField);
150
151 crc32OptionPanel.setLayout(new BoxLayout(crc32OptionPanel, BoxLayout.X_AXIS));
152 crc32CheckBox = new JCheckBox("CRC32 checksum:");
153 crc32CheckBox.setSelected(true);
154 crc32TextField = new JTextField();
155 crc32OptionPanel.add(crc32CheckBox);
156 crc32OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
157 crc32OptionPanel.add(crc32TextField);
158 }
159
160 private void createOperationPanel() {
161 operationPanel = new JPanel();
162
163 JButton compareButton = new JButton("Compare");
164 compareButton.setFocusPainted(false);
165 compareButton.addActionListener(arg0 -> {
166 File file = filePanel.getFile();
167 if (file == null) {
168 logger.error("file is null");
169 return;
170 }
171 calculate(file);
172 });
173
174 progressBar = new JProgressBar();
175 progressBar.setStringPainted(true);
176 progressBar.setMaximum(100);
177
178
179 operationPanel.setLayout(new BoxLayout(operationPanel, BoxLayout.X_AXIS));
180 operationPanel.add(compareButton);
181 operationPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
182 operationPanel.add(progressBar);
183
184 }
185
186 private void calculate(File file) {
187 progressBar.setValue(0);
188 new Thread(()->{
189 sizeTextField.setText(edu.jiangxin.apktoolbox.utils.FileUtils.sizeOfInHumanFormat(file));
190 progressBar.setValue(progressBar.getValue() + 5);
191 }).start();
192
193 new Thread(()->{
194 try {
195 lastModifiedTimeTextField.setText(String.valueOf(FileUtils.lastModified(file)));
196 } catch (IOException e) {
197 lastModifiedTimeTextField.setText("Unknown");
198 }
199 progressBar.setValue(progressBar.getValue() + 5);
200 }).start();
201
202 new Thread(()->{
203 if (md5CheckBox.isSelected()) {
204 md5TextField.setText(calculate(CalculateType.Md5, file));
205 } else {
206 md5TextField.setText("");
207 }
208 progressBar.setValue(progressBar.getValue() + 15);
209 }).start();
210
211 new Thread(()->{
212 if (sha1CheckBox.isSelected()) {
213 sha1TextField.setText(calculate(CalculateType.Sha1, file));
214 } else {
215 sha1TextField.setText("");
216 }
217 progressBar.setValue(progressBar.getValue() + 15);
218 }).start();
219
220 new Thread(()->{
221 if (sha256CheckBox.isSelected()) {
222 sha256TextField.setText(calculate(CalculateType.Sha256, file));
223 } else {
224 sha256TextField.setText("");
225 }
226 progressBar.setValue(progressBar.getValue() + 15);
227 }).start();
228
229 new Thread(()->{
230 if (sha384CheckBox.isSelected()) {
231 sha384TextField.setText(calculate(CalculateType.Sha384, file));
232 } else {
233 sha384TextField.setText("");
234 }
235 progressBar.setValue(progressBar.getValue() + 15);
236 }).start();
237
238 new Thread(()->{
239 if (sha512CheckBox.isSelected()) {
240 sha512TextField.setText(calculate(CalculateType.Sha512, file));
241 } else {
242 sha512TextField.setText("");
243 }
244 progressBar.setValue(progressBar.getValue() + 15);
245 }).start();
246
247 new Thread(()->{
248 if (crc32CheckBox.isSelected()) {
249 crc32TextField.setText(calculate(CalculateType.Crc32, file));
250 } else {
251 crc32TextField.setText("");
252 }
253 progressBar.setValue(progressBar.getValue() + 15);
254 }).start();
255 }
256
257 private String calculate(final CalculateType selectedHash, final File file) {
258 String result = "";
259 try (FileInputStream fis = new FileInputStream(file)) {
260 switch (selectedHash) {
261 case Md5: {
262 result = DigestUtils.md5Hex(fis);
263 break;
264 }
265 case Sha1: {
266 result = DigestUtils.sha1Hex(fis);
267 break;
268 }
269 case Sha256: {
270 result = DigestUtils.sha256Hex(fis);
271 break;
272 }
273 case Sha384: {
274 result = DigestUtils.sha384Hex(fis);
275 break;
276 }
277 case Sha512: {
278 result = DigestUtils.sha512Hex(fis);
279 break;
280 }
281 case Crc32: {
282 result = Long.toHexString(FileUtils.checksumCRC32(file));
283 break;
284 }
285 default: {
286 result = "Not support";
287 break;
288 }
289 }
290 } catch (FileNotFoundException e) {
291 logger.error("calculate, FileNotFoundException");
292 } catch (IOException e) {
293 logger.error("calculate, IOException");
294 }
295 return result;
296 }
297 }
298